package com.guodi.common.dto;

import lombok.Data;
import org.springframework.util.CollectionUtils;

import java.io.InputStream;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.Objects;

/**
 * zip压缩实体dto
 */
@Data
public class ZipEntityDTO {
    /**
     * (不能为空)文件名
     */
    private String fileName;
    /**
     * 文件内容，如果为空，则视为目录，如果有children，即便content有内容，也视为目录
     */
    private InputStream content;
    /**
     * 子文件/目录
     */
    private List<ZipEntityDTO> children;

    /**
     * 用于构建树，非必要项。如果不调用buildTree方法，则不需要填
     * */
    private String id;
    /**
     * 用于构建树，非必要项。如果不调用buildTree方法，则不需要填
     * */
    private String parentId;

    /**
     * 把列表转成树，所有元素都必须把id和parentId补上
     * @入参： parentIdList 父级id列表，如果parentIdList为空，则根节点的parentId判断为null；如果parentIdList不为空，则根节点的parentId判断为parentIdList中的元素
     * @入参： list 文件列表
     * */
    public static List<ZipEntityDTO> buildTree(List<ZipEntityDTO> list, List<String> parentIdList){
        if (CollectionUtils.isEmpty(list)){
            return list;
        }
        List<ZipEntityDTO> tree = new LinkedList<>();
        for(ZipEntityDTO zipEntityDTO : list) {
            if (CollectionUtils.isEmpty(parentIdList)){
                // 如果parentIdList为空，则根节点的parentId判断为null
                if (Objects.isNull(zipEntityDTO.getParentId())){
                    // 添加自己
                    tree.add(zipEntityDTO);
                    // 处理子级
                    List<ZipEntityDTO> childList = buildTree(list, Arrays.asList(zipEntityDTO.getId()));
                    zipEntityDTO.setChildren(childList);
                }
            }else {
                // 如果parentIdList不为空，则根节点的parentId判断为parentIdList中的元素
                if (parentIdList.contains(zipEntityDTO.getParentId())){
                    // 添加自己
                    tree.add(zipEntityDTO);
                    // 处理子级
                    List<ZipEntityDTO> childList = buildTree(list, Arrays.asList(zipEntityDTO.getId()));
                    zipEntityDTO.setChildren(childList);
                }
            }
        }
        return tree;
    }
}
